/******************************************************************************
** 公司名称：天津柯迪斯科技有限公司
** 版权信息：
** 文件名称： App_Protocol_LISHUI_CAN.h
** 模块名称： 溧水CAN协议处理模块
** 版 本 号： V1.0
** 作    者： 蒲磊
**
** 修改记录： 版本     修改人      时间         修改内容
******************************************************************************/
#ifndef __APP_PROTOCOL_LISHUI_H_
#define __APP_PROTOCOL_LISHUI_H_

/******************************************************************************
* 头文件
******************************************************************************/
#include "bsp.h"
/******************************************************************************
* 宏定义 ('#define')
******************************************************************************/
#define CAN_LOOP_CYCLE              20      /*vBF_CAN_Loop()函数的循环调用周期，单位：ms*/
#define gxCAN_RxQueue               0x00    /*Can接收FIFO队列ID*/
#define gxCAN_TxQueue               0x01    /*Can发送FIFO队列ID*/
#define gxCAN_RxQueue_Len           (sizeof(strLISHUI_CAN) * 30)    /*FIFO长度，30个元素长度*/
#define gxCAN_TxQueue_Len           (sizeof(strLISHUI_CAN) * 30)
/******************************************************************************
* 类型定义 ('typedef')
******************************************************************************/
/*设备ID类型*/
typedef enum
{
    ID_TE           = 0x20,         /*终端、诊断仪*/
    ID_DP           = 0x28,        /*仪表*/
    ID_MCU          = 0xEF,        /*控制器*/
    ID_BMS_1        = 0xF4,        /*主BMS*/
    ID_CHARGER      = 0x56,        /*充电器*/
} enuDEVICE_ID;

/*溧水CAN协议结构体*/
typedef struct
{
    uint8_t Source_Adress;          /*源地址*/
    uint8_t PS;                     /*协议数据单元特定域*/
    uint8_t PDU_Format;             /*协议数据单元格式*/
    uint8_t Data_Page;              /*数据页*/
    uint8_t Reserver;               /*无用，保留*/
    uint8_t Priority;               /*优先级*/
    uint8_t Data[8];                /*数据*/
} strLISHUI_CAN;

typedef struct
{
    uint8_t  Year;
    uint8_t  Month;
    uint8_t  Day;
    uint8_t  Hour;
    uint8_t  Min;
    uint8_t  Sec;
} strDATE_TIME;

/*控制器消息结构体*/
typedef struct
{
    uint8_t     Encryption_Type;    /*加密类型,0-无加密*/
    uint8_t     Key1;               /*密钥1*/
    uint8_t     Key2;               /*密钥2*/
    uint8_t     Key3;               /*密钥3*/
    uint8_t     Key4;               /*密钥4*/
    uint8_t     Key_Type;           /*按键类型，0-按键在仪表上，仪表为主机，1-按键在控制器上，控制为主机*/
    uint16_t    Protocol_Ver;       /*通讯协议版本号*/

    uint8_t     Walk;               /*推行状态，0-未启动，1-推行工作状态*/
    uint8_t     InSetting;          /*进入设置状态，0-未进设置，1-进入设置*/
    uint8_t     Pas;                /*档位数值*/

    uint8_t     Lamp;               /*大灯状态，0-关闭，1-打开*/
    uint8_t     Break;              /*刹车状态，0-无刹车，1-有刹车*/
    uint8_t     Motor_Output;       /*电机是否有输出，0-电机无输出，1-电机有输出*/
    uint8_t     Display_On;         /*仪表是否显示，0-全黑，1-有显示*/
    uint8_t     Button;             /*按键状态，bit1-左键，bit2-右键，bit0-电源键，bit4-减键，bit3-加减。0-未按下，1-按下*/


    uint16_t    Speed;              /*实时车速，0.1Km/h*/
    uint16_t    ErrCode;            /*故障代码*/

    uint8_t     Rpm;                /*脚踏转速*/
    uint8_t     Torque;             /*脚踏力矩，1Nm*/
    uint16_t    Voltage;            /*电池电压，0.1V*/
    uint16_t    Current;            /*母线电流，0.1A*/
    uint8_t     MCU_Temp;           /*控制器温度，-50-205度*/
    uint8_t     Motor_Temp;         /*电机温度，-50-205度*/
    uint8_t     Power_Soc;          /*功率百分比，0-100%*/
    int8_t      Soc;                /*电池电量，0-100%*/

    uint32_t    ODO;                /*ODO里程，0.1Km，范围999999*/
    uint16_t    ErrCode_Ext;        /*扩展错误代码*/

} strMCUInfo;

/*BMS消息结构体*/
typedef struct
{
    uint8_t     PowerOn;            /*开关机，0-关机，1-开机*/
    uint8_t     Encryption_Type;    /*加密类型,0-无加密*/
    uint8_t     Key;                /*密钥*/
    uint16_t    Device_Type;        /*设备类型*/
    uint16_t    User_SN;            /*客户编码*/
    uint16_t    Vehicle_Type;       /*车辆型号*/

    uint8_t     Temp_Num;           /*温度探头数量*/
    uint8_t     Temp[7];            /*各探头温度，-40-215*/

    uint8_t     SOH;                /*SOH ,%*/
    int8_t      SOC;                /*SOC,1%精度,-1表示未接受到SOC数据*/
    uint16_t    Capacity_Remain;    /*剩余容量，0.01Ah*/
    uint16_t    Capacity_Full;      /*满电容量，0.01Ah*/
    uint16_t    Capacity_Design;    /*设计容量，0.01Ah*/

    uint16_t    Cell_Num_Serial;    /*电池芯体串联数量*/
    uint16_t    Cell_Num_Parallel;  /*电池芯体并联数量*/
    uint16_t    Cell_Volt[15];      /*电芯电压，1mv*/

    uint16_t    Voltage;            /*电池组电压，0.1V*/
    uint16_t    Current;            /*电池组电流，0.01A，偏移量32768*/
    uint8_t     MaxCurrent_Continued;/*最大持续电流，1A*/
    uint8_t     MaxCurrent_Peak;    /*最大峰值电流，1A*/
    uint8_t     MaxCurrent_Charge;  /*最大充电电流，0.1A*/
    uint8_t     Power_Scale;        /*功率输出系数，%*/

    uint32_t    AlarmInfo;          /*电池组警告*/
    uint32_t    ProtectInfo;        /*电池组保护信息*/

    uint8_t     Charge_State;       /*充电状态*/
    uint8_t     Discharge_State;    /*放电状态*/


    uint16_t    Cycle_Times;        /*循环次数*/
    uint16_t    Charging_Time_Interval;/*充电时间间隔*/
    uint16_t    Charging_Time_Interval_Max;/*最大充电时间间隔*/
    uint16_t    Active_Time;        /*激活时间*/

    uint8_t     ID_Num;             /*电池条码位数*/
    uint8_t     ID[31];             /*电池条码*/

    uint8_t     Soft_Version_1[8];  /*软件版本号*/
    uint8_t     Hard_Version_1[8];  /*硬件版本号1*/
    uint8_t     Hard_Version_2[8];  /*硬件版本号2*/

    strDATE_TIME  RTC_Time;
    strDATE_TIME  RTC_LastCalibration;  /*上次校准时间*/

} strBatteryInfo;

/*仪表消息结构体*/
typedef struct
{
    uint8_t     Walk;               /*推行是否使能，0-禁止，1-允许*/
    uint8_t     Pas;                /*档位数值*/
    uint8_t     Lamp;               /*大灯状态，0-关闭，1-打开*/
    uint16_t    Low_Voltage;        /*欠压值，0.1V*/
    uint8_t     Low_Voltage_Flag;   /*欠压标志*/

} strDisplayInfo;

/*定义车辆信息结构体*/
typedef    struct
{
    strBatteryInfo    Battery;
    strMCUInfo		  MCU;
    strDisplayInfo    Display;
    uint8_t			  ErrCode;

} strBikeInfo;

/******************************************************************************
* 全局变量声明
******************************************************************************/

/******************************************************************************
* 函数声明
******************************************************************************/
void vPROTOCOL_Init(void);
void vPROTOCOL_Get_OneFrame(uint8_t *pData,uint16_t Len);
void vPROTOCOL_Loop(void);
void vPROTOCOL_Send_Run_Data(void);
void vPROTOCOL_Send_Config_Data(void);
void vPROTOCOL_Send_Config_Data_OneTime(void);
void vCan_Send_RequestPGN(enuDEVICE_ID Dst_ID,uint32_t PGN);



void vPROTOCOL_Set_Lamp(uint8_t State);
void vPROTOCOL_Set_Pas(int8_t Pas);
void vPROTOCOL_Set_Low_Voltage(uint16_t LowVoltage);

int8_t       cPROTOCOL_Get_Soc(void);
uint8_t     ucPROTOCOL_Get_Power_Soc(void);
uint16_t    usPROTOCOL_Get_Voltage(void);
uint16_t    usPROTOCOL_Get_Current(void);
uint16_t    usPROTOCOL_Get_Speed(void);
uint8_t     ucPROTOCOL_Get_Errcode(void);
uint8_t     ucPROTOCOL_Get_Cadance(void);
uint32_t    ulPROTOCOL_Get_Odo(void);
uint8_t     ucPROTOCOL_Get_Walk_Status(void);
uint8_t     ucPROTOCOL_Get_Pas(void);
uint8_t     ucPROTOCOL_Get_IsInSetting(void);
uint8_t     ucPROTOCOL_Get_Lamp_Status(void);
uint8_t     ucPROTOCOL_Get_Up_Key(void);
uint8_t     ucPROTOCOL_Get_Down_Key(void);
uint8_t     ucPROTOCOL_Get_Power_Key(void);
uint8_t     ucPROTOCOL_Get_i_Key(void);
int16_t      sPROTOCOL_Get_MCU_Temp(void);
int16_t      sPROTOCOL_Get_Motor_Temp(void);

uint16_t    usPROTOCOL_Get_BMS_Voltage(void);
int16_t      sPROTOCOL_Get_BMS_Current(void);
uint8_t     ucPROTOCOL_Get_BMS_SOH(void);
int8_t       cPROTOCOL_Get_BMS_SOC(void);
uint16_t    usPROTOCOL_Get_BMS_ResCap(void);
uint8_t     ucPROTOCOL_Get_BMS_CycleTimes(void);
uint8_t     ucPROTOCOL_Get_BMS_SeriesNum(void);
uint8_t     ucPROTOCOL_Get_BMS_ParallelNum(void);
uint16_t    usPROTOCOL_Get_BMS_Cell_Voltage(uint8_t CellNum);
char        *pPROTOCOL_Get_BMS_Barcode(void);
char        *pPROTOCOL_Get_BMS_Soft_Version(void);
char        *pPROTOCOL_Get_BMS_Hard_Version_1(void);
char        *pPROTOCOL_Get_BMS_Hard_Version_2(void);

void vPROTOCOL_Send(void);

void vPROTOCOL_ResetCommunicationOverTime(void);
void vPROTOCOL_Set_Value_When_PowerOn(void);

void vPROTOCOL_Set_Pas_Range(int8_t Pas_Range);

#endif
